import Joi from 'joi';
import { USER_STATUS } from '#src/constants/user.constants.js';
import crypto from 'crypto';
/**
 * 用户模型类
 * @class User
 * @description 定义用户数据结构、验证规则和关联关系
 */
export class User {

 /**
     * 生成安全UUID
     * @static
     * @returns {string} RFC 4122兼容的UUIDv4
     */
 static generateUUID() {
    return crypto.randomUUID();
}

    /**
     * 创建用户验证模式
     * @static
     * @returns {Joi.ObjectSchema} Joi验证模式
     */
    static createSchema() {
        return Joi.object({
            email: Joi.string()
                .email()
                .required()
                .max(100)
                .pattern(/^[\w.-]+@[\w.-]+\.\w+$/)
                .messages({
                    'string.email': '邮箱格式不正确',
                    'string.max': '邮箱长度不能超过100个字符',
                    'any.required': '邮箱是必填项',
                    'string.pattern.base': '邮箱格式不正确'
                }),
            username: Joi.string()
                .min(2)
                .max(50)
                .pattern(/^[\u4e00-\u9fa5a-zA-Z0-9]+$/)
                .required()
                .messages({
                    'string.min': '用户名至少2个字符',
                    'string.max': '用户名最多50个字符',
                    'any.required': '用户名是必填项',
                    'string.pattern.base': '用户名只能包含中文、字母和数字'
                }),
            password: Joi.string()
                .min(8)
                .max(30)
                .pattern(/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]+$/)
                .required()
                .messages({
                    'string.min': '密码长度不能小于8个字符',
                    'string.max': '密码长度不能超过30个字符',
                    'any.required': '密码是必填项',
                    'string.pattern.base': '密码必须包含大小写字母、数字和特殊字符'
                }),
            status: Joi.number()
                .integer()
                .default(1)  // 添加默认值 1 表示激活状态
                .valid(...Object.values(USER_STATUS))
                .messages({
                    'number.base': '状态必须是数字',
                    'number.integer': '状态必须是整数'
                })
        
        });
    }

    /**
     * 更新用户验证模式
     * @static
     * @returns {Joi.ObjectSchema} Joi验证模式
     */
    static updateSchema() {
        return Joi.object({
            password: Joi.string()
                .min(6)
                .max(30)
                .messages({
                    'string.min': '密码长度不能小于6个字符',
                    'string.max': '密码长度不能超过30个字符'
                }),
            status: Joi.number()
                .valid(...Object.values(USER_STATUS))
        }).min(1).messages({
            'object.min': '至少需要提供一个更新字段'
        });
    }

    /**
     * 构建用户表结构
     * @static
     * @returns {Object} 表结构定义
     */
    static tableSchema() {
        return {
            name: 'users',
            columns: [
                { 
                    name: 'id', 
                    type: 'CHAR(36)',  // 修改类型
                    primaryKey: true,
                    // 移除autoIncrement
                },
                { name: 'email', type: 'VARCHAR(100)', unique: true, notNull: true },
                { name: 'username', type: 'VARCHAR(50)', notNull: true },
                { name: 'password', type: 'VARCHAR(255)', notNull: true },
                { name: 'status', type: 'INTEGER', defaultValue: 1 },
                { name: 'created_at', type: 'TIMESTAMP', defaultValue: 'CURRENT_TIMESTAMP' },
                { name: 'updated_at', type: 'TIMESTAMP', defaultValue: 'CURRENT_TIMESTAMP', onUpdate: 'CURRENT_TIMESTAMP' }
            ],
            indexes: [
                { name: 'email_idx', columns: ['email'] }
            ]
        };
    }
}
